package ufmg.arcabouco.ga;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class GeneticAlgorithmGA {

	public double cruzamento = 0.9;
	public double mutacao = 0.7;
	public int geracoes = 10;

	public int torneio = 2;
	public boolean elitismo = true;
	public int tamanhoPopulacao = 1000;

	public int pior = 0;
	public int melhor = 0;

	public Random rand;

	
	
	public GeneticAlgorithmGA(long seed) {
		super();
		rand = new Random(seed);
	}

	public List<IndividuoGA> operador(IndividuoGA IndividuoGA1,
			IndividuoGA IndividuoGA2) {

		List<IndividuoGA> populacao = new ArrayList<IndividuoGA>();

		double media = (IndividuoGA1.getFitness() + IndividuoGA2.getFitness()) / 2;

		List<IndividuoGA> filhos = null;
		if (rand.nextDouble() <= cruzamento) {
			filhos = IndividuoGA1.crossOver(IndividuoGA2);
		}

		if (filhos != null) {
			IndividuoGA1 = filhos.get(0);
			IndividuoGA2 = filhos.get(1);
		}

		if (rand.nextDouble() <= mutacao) {
			IndividuoGA1.mutacao();
		}
		if (rand.nextDouble() <= mutacao) {
			IndividuoGA2.mutacao();
		}

		if (IndividuoGA1.getFitness() > media) {
			melhor++;
		} else {
			pior++;
		}

		if (IndividuoGA2.getFitness() > media) {
			melhor++;
		} else {
			pior++;
		}

		return populacao;
	}

	protected IndividuoGA torneio(List<IndividuoGA> populacao) {
		IndividuoGA pai = null;
		double max = 0;
		for (int i = 0; i < torneio; i++) {
			IndividuoGA aux = populacao.get(rand.nextInt(populacao.size() - 1));
			if (aux.getFitness() > max) {
				pai = aux;
				max = aux.getFitness();
			}
		}
		return pai;
	}

}
